perm filename EMAIN4.2[EAL,HE]1 blob sn#674829 filedate 1982-09-27 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	{$NOMAIN	Editor: Statement executor for immediate mode }
C00006 00003	procedure eDoStmnt external
C00010 ENDMK
C⊗;
{$NOMAIN	Editor: Statement executor for immediate mode }

%include emain.hdr;

{ Externally defined routines from elsewhere: }

	(* From ALLOC *)
procedure relStatement(n: statementp);				external;

	(* From CALLER *)
procedure emAddStmnt(firstTime: boolean; which: integer);	external;
function em4StmntParse(var cblk,newDecs: statementp; 
	cproc: varidefp): statementp;				external;

	(* From ETOKEN *)
procedure eGetToken;						external;

	(* From PAUX2 *)
procedure relExpr(n: nodep);					external;

	(* From EEXPAR *)
function eExprParse: nodep;					external;

	(* From EPAR3C *)
function declarationp: boolean;					external;

	(* From EPAR3D *)
function addNewDeclarations: integer;				external;

	(* From EAUX3B *)
procedure collectStmnt(s: statementp);				external;

	(* From EDEBUG *)
procedure executeStmnt(st: statementp; which: integer);		external;
procedure pevalExpr(n: nodep; which: integer);			external;

	(* From PP *)
function getLine(length: integer): linerecp;			external;
procedure relLine(l: linerecp);					external;
procedure ppLine; 						external;
procedure ppOutNow; 						external;
procedure ppChar(ch: ascii); 					external;
procedure pp5(ch: c5str; length: integer); 			external;
procedure pp10(ch: cstring; length: integer); 			external;
procedure pp10L(ch: cstring; length: integer);			external;
procedure pp20(ch: c20str; length: integer); 			external;
procedure pp20L(ch: c20str; length: integer); 			external;
procedure ppInt(i: integer); 					external;
procedure ppReal(r: real); 					external;
procedure ppStrng(length: integer; s: strngp); 			external;
procedure ppDtype(d: datatypes);				external;
procedure ppDelChar; 						external;

	(* From DISP *)
procedure showCursor(line,col: integer); 			external;


procedure em4Get; external;
procedure em4Get; begin end;

procedure eDoStmnt; external;
procedure eDoStmnt;
 var s,sp: statementp; b: boolean; n: nodep;
     i: integer;
 begin
 with eCurToken do
  begin
  eBackup := true;
  newVarOk := false;	(* don't accept undefined variables *)
  n := eExprParse;		(* see what we're to evaluate *)
  eGetToken;		(* & check if it's followed by an ":=" *)
  newVarOk := true;
  if newDeclarations <> nil then
    begin
    b := false;
    s := newDeclarations;
    newDeclarations := nil;
    repeat
     s↑.variables↑.vtype := freevartype;
     s↑.variables↑.name := nil;
     sp := s;
     s := s↑.last;
     relStatement(sp);
    until s↑.stype = blocktype;
    end
   else b := true;
  if (ttype = reswdtype) and (rtype = stmnttype) and
     (stmnt = assigntype) then
    begin				(* have parser parse it *)
    relExpr(n);			(* don't need this any more *)
    i := cursor;
    s := em4StmntParse(curBlock,newDeclarations,curProc);
    showCursor(cursorLine-topDline-firstDline+2,1);
    i := addNewDeclarations;
    if s↑.stype = emptytype then relStatement(s)
     else
      begin
      collectStmnt(s);		(* if collecting add stmnt to prog *)
      executeStmnt(s,4);	(* go do it *)
      end;
    end
   else if b then pevalExpr(n,4)	(* eval & print out expr *)
   else
    begin
    relExpr(n);				(* flush bad expr *)
    pp20('Undefined variable(s',20); pp20(') - bad expression  ',18); ppLine;
    end;
  end
 end;


procedure eDoOtherCmd; external;
procedure eDoOtherCmd;
 var i: integer; s: statementp;
 begin
 with eCurToken do
  begin
  eBackup := true;
  if declarationp then
    begin
    eBackup := true;
    emAddStmnt(false,4);	(* Use overlay caller *)
    end
   else
    begin			(* have parser parse it *)
    i := cursor;
    s := em4StmntParse(curBlock,newDeclarations,curProc);
    showCursor(cursorLine-topDline-firstDline+2,1);
    i := addNewDeclarations;
    if s↑.stype = emptytype then relStatement(s)
     else
      begin
      collectStmnt(s);		(* if collecting add stmnt to prog *)
      executeStmnt(s,4);	(* go do it *)
      end;
    end
  end
 end;